package xgame.chat.bizservice;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;

import xgame.AbstractXresult;
import xgame.chat.model.ChatMessage;
import xgame.chat.model.ChatUser;
import xgame.chat.result.EntryResult;
import xgame.chat.result.MessageResult;
import xgame.chat.result.NewComerResult;

/**
 * 聊天服务
 * 
 * @author AfritXia
 * @version $Rev: 0 $
 *
 */
public class ChatService {
	/**
	 * 聊天室 -> 用户列表字典
	 * 
	 */
	private Map<String, List<ChatUser>> _room2usersMap = new ConcurrentHashMap<String, List<ChatUser>>();

	/**
	 * 用户 Id -> 聊天室字典
	 * 
	 */
	private Map<Long, String> _userId2roomMap = new ConcurrentHashMap<Long, String>();

	/**
	 * 进入聊天室
	 * 
	 * @param newRoom 
	 * @param newUser 
	 * 
	 */
	public EntryResult entry(String newRoom, ChatUser newUser) {
		if (newRoom == null || newUser == null) {
			return null;
		}

		/* 1. 将用户从旧聊天室列表中移除 */ {
			this.removeUserInOldRoom(newUser.getUserId());
		}

		// 获取用户列表
		List<ChatUser> newUserList = this._room2usersMap.get(newRoom);
		
		/* 2. 将用户添加到新聊天室列表 */ {
			if (newUserList == null) {
				// 创建用户列表
				newUserList = new CopyOnWriteArrayList<ChatUser>();
				// 添加用户列表到字典
				this._room2usersMap.put(newRoom, newUserList);
			}
	
			// 添加用户到列表
			newUserList.add(newUser);
			// 更新用户 Id -> 聊天室字典
			this._userId2roomMap.put(newUser.getUserId(), newRoom);
		}

		/* 3. 创建和分发结果 */ {
			// 创建结果
			EntryResult result = new EntryResult();

			// 自结果列表
			result.setSubResultList(new ArrayList<AbstractXresult>());
	
			for (ChatUser u : newUserList) {
				// 创建子结果
				NewComerResult subResult = new NewComerResult();
				
				// 设置会话 Id
				subResult.setSessionId(u.getSessionId());
				// 设置新来者
				subResult.setNewComer(newUser.getUserName());
				// 设置用户列表
				subResult.setUserList(newUserList);
	
				// 添加在线用户结果
				result.getSubResultList().add(subResult);
			}

			return result;
		}
	}

	/**
	 * 删除用户与旧聊天室的关联
	 * 
	 * @param userId 
	 * 
	 */
	private void removeUserInOldRoom(long userId) {
		if (userId <= 0) {
			return;
		}

		// 获取旧聊天室
		String oldRoomName = this._userId2roomMap.get(userId);

		if (oldRoomName == null) {
			return;
		}

		// 获取旧聊天室中的用户列表
		List<ChatUser> oldUserList = this._room2usersMap.get(oldRoomName);

		if (oldUserList == null) {
			return;
		}
		
		// 查找用户在列表中的位置
		int index = this.findUser(userId, oldUserList);

		if (index != -1) {
			// 将用户从旧聊天室列表中清除
			oldUserList.remove(index);

			if (oldUserList.size() <= 0) {
				this._room2usersMap.remove(oldRoomName);
			}
		}

		// 清理用户 Id -> 聊天室字典
		this._userId2roomMap.remove(userId);
	}

	/**
	 * 查找指定用户 Id 在列表中的位置
	 * 
	 * @param userId
	 * @param ul
	 * @return 
	 * 
	 */
	private int findUser(long userId, List<ChatUser> ul) {
		if (userId <= 0 || ul == null) {
			return -1;
		}

		for (int i = 0; i < ul.size(); i++) {
			if (ul.get(i) != null && 
				ul.get(i).getUserId() == userId) {
				return i;
			}
		}

		return -1;
	}

	/**
	 * 广播消息
	 * 
	 * @param userId
	 * @param text
	 * @return 
	 * 
	 */
	public MessageResult broadcast(ChatMessage msg) {
		if (msg == null) {
			return null;
		}

		// 获取聊天室名称
		String roomName = this._userId2roomMap.get(msg.getUserId());

		if (roomName == null) {
			return null;
		}

		// 获取聊天室用户列表
		List<ChatUser> ul = this._room2usersMap.get(roomName);

		if (ul == null) {
			return null;
		}

		MessageResult result = new MessageResult();

		// 设置文本
		result.setText(msg.getText());
		// 设置发送用户
		result.setPostUser(msg.getPostUser());
		// 设置子结果列表
		result.setSubResultList(new ArrayList<AbstractXresult>());

		for (ChatUser u : ul) {
			if (u.getUserId() == msg.getUserId()) {
				continue;
			}

			// 创建子结果
			MessageResult subResult = new MessageResult();

			// 设置会话 Id
			subResult.setSessionId(u.getSessionId());
			// 设置用户名称
			subResult.setPostUser(msg.getPostUser());
			// 设置文本
			subResult.setText(msg.getText());

			// 添加子结果
			result.getSubResultList().add(subResult);
		}

		return result;
	}
}
